#include<bits/stdc++.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#define N 10
#define void(*type)()
//void RunChild()
//{
//  int cnt = 5;
//  while(cnt)
//  {
//    printf("I am Child Process,pid:%d,ppid:%d\n",getpid(),getppid());
//    sleep(1);
//    cnt--;
//  }
//}
using namespace std;
int main()
{
  pid_t id = fork();
 if(id < 0)
 {
  perror("fork");
  return 1;
 }
 else if(id == 0)
 {
  //子
   int cnt = 6;
   while(cnt)
   {
    printf("i am child,pid:%d,ppid:%d\n",getpid(),getppid());
    cnt--;
    sleep(1);
    //int a = 10;
   // a = a / 0;
   }
   exit(1);
 }
 else
 {
  //父
 // int cnt = 5;
 // while(cnt)
 // {
 //   printf("I am parent,pid:%d,ppid:%d\n",getpid(),getppid());
 //   cnt--;
 //  sleep(1);
 // }
  int status = 0;
  while(1)//轮询
  {
  pid_t ret = waitpid(id,&status,WNOHANG);//非阻塞
  //pid_t ret = waitpid(id,&status,0);//阻塞等待
  if(ret > 0)
  {
    //cout << "子进程的pid:" << ret << endl;
    //cout << "signal:" << (status&0x7f) << endl;
    //cout << "exitcode:" << ((status&0xff00)>8) << endl;
    if(WIFEXITED(status))
    {
      printf("进程正常跑完,退出码是:%d\n",WEXITSTATUS(status));
    }
      break;
  }
    else if(ret < 0)
    {
      printf("进程出异常了\n");
      break;
    }
    else
    {
      printf("子进程还没有退出\n");
    }
    sleep(1);
 }
  sleep(5);
  exit(0);
 
} 
//  for(int i = 0;i < N ;++i)
//  {
//    pid_t id = fork();
//    if(id == 0)
//    {
//      RunChild();
//      exit(i);
//    }
//    printf("create child process: %d success\n",id);
//  }
//  for(int i = 0;i < N;++i)
//  {
//    int status = 0;
//    pid_t id = waitpid(-1,&status,0);
//    if(id > 0)
//    {
//      printf("wait %d success,exit code:%d\n",id,WEXITSTATUS(status));
//    }
//  }
//
//  sleep(5);
//



  return 0;
}
